import MyPlugin from "../../../main";
export function 给代码块添加复制功能(this_:MyPlugin){

	// 监听文件打开事件
	this_.registerEvent(this_.app.workspace.on('file-open', (file) => {
		if (file) {
			console.log("监听文件打开事件")
			监听当前打开文件的Dom树的变化(this_)
			图片添加一个按钮(this_)
		}
	}));
	// 这个是当前工作区该表就会生效, 这个就是只要改变就有效，但是会判断当前是否打开了文件，如果没有打开文件就展示最近的文件
	this_.registerEvent(this_.app.workspace.on('layout-change', () => {
		const activeLeaf = this_.app.workspace.activeLeaf;
		// ** 注意,这个非常重要,这个if中必须打开新标签页才会执行,如果设置了打开文件,那么会执行两次,一次打开新标签页执行一次,一次打开文件改变布局执行一次,所以会执行两次
		// 所以如果加了锁,第二次就不会执行,就会不生效
		if (activeLeaf && activeLeaf.view.getViewType() === 'empty') {
			// 在当前页面打开文件(searchPageIndex,this_)
		}else {
			文件附件显示全路径名(this_)
			第一次打开文件时添加复制按钮(this_)
		}
	}));
}

// 这个我感觉是非常耗时的,需要遍历很多,但是为了实现功能不得不加
export async function 监听当前打开文件的Dom树的变化(this_:MyPlugin) {
	const activeLeaf =  this_.app.workspace.activeLeaf;
	if (!activeLeaf) return;

	const view = activeLeaf.view;
	if (view && view.containerEl) {
		// 停止之前的观察
		if (this_.observer) {
			this_.observer.disconnect();
		}

		// 创建一个新的 MutationObserver 实例
		this_.observer = new MutationObserver((mutationsList, observer) => {
			for (const mutation of mutationsList) {
				if (mutation.type === 'childList') {
					// 遍历新增的节点
					mutation.addedNodes.forEach((node) => {
						if (node instanceof HTMLElement && node.tagName === 'DIV') {
							// console.log('新增的 div:', node.className);
							if ( node.className.contains("cm-preview-code-block")){
								添加复制事件(node, this_)
							}
							// 图片上添加按钮
							// if ( node.className.contains("image-embed")){
							// 	图片添加一个按钮(this_)
							// }
						}
					});
					// 遍历删除的节点
					mutation.removedNodes.forEach((node) => {
						if (node instanceof HTMLElement && node.tagName === 'DIV') {
							// console.log('删除的 div:', node.className);
						}
					});
				} else if (mutation.type === 'attributes') {
					// console.log('属性有变动:', mutation);
				}
			}
		});
		// 开始观察当前文档的 DOM 树
		this_.observer.observe(view.containerEl, {
			attributes: true,
			childList: true,
			subtree: true
		});
	}
}


function 处理字符串(str: string): string {
	const suffix1 = '已复制';
	const suffix2 = '复制';
	if (str.endsWith(suffix1)) {
		str = str.slice(0, -suffix1.length); // 删除结尾的 "已复制"
	} else if (str.endsWith(suffix2)) {
		str = str.slice(0, -suffix2.length); // 删除结尾的 "复制"
	}
	// 检测最后的换行符类型
	if (str.endsWith('\r\n')) {
		str = str.slice(0, -2); // 删除 Windows 换行符 \r\n
	} else if (str.endsWith('\n')) {
		str = str.slice(0, -1); // 删除 Windows 换行符 \r\n
	}
	return str;
}

export async function 添加复制事件(fileElement: HTMLElement, this_: MyPlugin) {
	// 创建按钮元素
	const button = document.createElement('button');
	button.innerText = '复制';
	button.className = 'custom-copy-button'; // 添加CSS类名

	console.log("添加复制事件" + new Date().getTime());

	button.addEventListener('click', async (event) => {
		// 获取选中的文本
		const selectedText = window.getSelection()?.toString() || '';
		// 原始字符串
		let str = fileElement.innerText; // 可以是 "这是一个测试字符串 已复制" 或其他情况
		const suffix1 = '已复制';
		const suffix2 = '复制';
		if (str.endsWith(suffix1)) {
			str = str.slice(0, -suffix1.length); // 删除结尾的 "已复制"
		} else if (str.endsWith(suffix2)) {
			str = str.slice(0, -suffix2.length); // 删除结尾的 "复制"
		}
		// 检测最后的换行符类型
		if (str.endsWith('\r\n')) {
			str = str.slice(0, -2); // 删除 Windows 换行符 \r\n
		} else if (str.endsWith('\n')) {
			str = str.slice(0, -1); // 删除 Windows 换行符 \r\n
		}
		// 判断是否有选中的文本
		const codeText = selectedText.length > 0 ? selectedText : str;
		// 使用 Clipboard API 复制文本到剪贴板
		try {
			await navigator.clipboard.writeText(codeText);
			console.log('代码已复制');
			button.innerText = '已复制';
			// 在1秒后恢复按钮的初始状态
			setTimeout(() => {
				button.innerText = '复制';
			}, 1000);
		} catch (err) {
			console.error('复制失败', err);
		}
	});

	// 确保 codeBlock 是相对定位的容器
	fileElement.style.position = 'relative';

	// 将按钮添加到 div 中
	fileElement.appendChild(button);
}

export async function 文件附件显示全路径名(this_:MyPlugin) {
	// 获取当前活动的文件
	const currentFile = this.app.workspace.getActiveFile();
	if (currentFile) {
		console.log(99999999)
		const activeLeaf = this.app.workspace.activeLeaf;
		// 确保获取到了活动的叶子节点
		if (activeLeaf) {
			// 获取当前活动视图的内容容器元素
			const container = activeLeaf.view.containerEl;
			// 使用querySelectorAll在容器中查找所有类名为'aaa'的元素
			const fileElements = container.querySelectorAll('.file-embed');
			fileElements.forEach((fileElement: HTMLElement) => {
				fileElement.classList.add('persistent-file-link');
				// 查找内部的 span 元素（包含文件名）
				const titleElement = fileElement.querySelector('.file-embed-title span');
				if (titleElement) {
					// 获取 src 属性（文件路径）
					const src = fileElement.getAttribute('src');
					if (src) {
						// 将文件名替换为文件的完整路径
						titleElement.textContent = src;
					}
				}
			});
		}
	}
}

export async function 第一次打开文件时添加复制按钮(this_:MyPlugin) {
	// 获取当前活动的文件
	const currentFile = this.app.workspace.getActiveFile();
	if (currentFile) {
		const activeLeaf = this.app.workspace.activeLeaf;
		// 确保获取到了活动的叶子节点
		if (activeLeaf) {
			// 获取当前活动视图的内容容器元素
			const container = activeLeaf.view.containerEl;
			// 使用querySelectorAll在容器中查找所有类名为'aaa'的元素
			const fileElements = container.querySelectorAll('.cm-preview-code-block');
			fileElements.forEach((fileElement: HTMLElement) => {
				添加复制事件(fileElement, this_)
			});
		}
	}
}

export async function 图片添加一个按钮(this_:MyPlugin) {
	// 获取当前活动的文件
	const currentFile = this.app.workspace.getActiveFile();
	if (currentFile) {
		const activeLeaf = this.app.workspace.activeLeaf;
		// 确保获取到了活动的叶子节点
		if (activeLeaf) {
			// 获取当前活动视图的内容容器元素
			const container = activeLeaf.view.containerEl;
			// 使用querySelectorAll在容器中查找所有类名为'aaa'的元素
			const fileElements = container.querySelectorAll('.image-embed');
			console.log(fileElements+"00000000000000000000000000000")
			fileElements.forEach((fileElement: HTMLElement) => {
				// 查找 fileElement 内部的 img 标签
				const img = fileElement.querySelector('img');
				if (img) {
					console.log("图片添加一个按钮 - 找到包含图片的div");
					// 创建一个按钮元素
					const button = document.createElement('button');
					button.innerText = '路径';
					button.className = 'custom-image-button';
					// 为按钮添加点击事件
					button.addEventListener('click', () => {
						// alert('按钮被点击了！');
					});
					// 确保 img 的父元素相对定位
					const imgParent = img.parentElement;
					if (imgParent) {
						imgParent.style.position = 'relative';
						// 将按钮添加到父元素中，使其悬浮在图片的右上角
						imgParent.appendChild(button);
					}

					console.log("图片添加一个按钮 - 找到包含图片的div");
					// 创建一个按钮元素
					const button2 = document.createElement('button');
					button2.innerText = '下移';
					button2.className = 'custom-image-button2';
					// 为按钮添加点击事件
					button2.addEventListener('click', () => {
						console.log("图片添加一个按钮 - 点击了下移按钮");
						// @ts-ignore
						app.commands.executeCommandById("hotkeysplus-obsidian:insert-line-above")
						// alert('按钮被点击了！');
					});
					if (imgParent) {
						imgParent.style.position = 'relative';
						// 将按钮添加到父元素中，使其悬浮在图片的右上角
						imgParent.appendChild(button2);
					}
				}
			});
		}
	}
}
